home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1995 June: Reference Library / Dev.CD Jun 95 / Dev.CD Jun 95.toast / What's New? / New System Software Extensions / QuickDraw 3D ß / Programming / SampleCode / VCDemo / Source / EventLoop.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-04-03  |  7.3 KB  |  307 lines  |  [TEXT/MPCC]

  1. /*
  2.     EventLoop.c
  3.  
  4.     Handle events.
  5.  
  6.     © 1995 Apple Computer, Inc.
  7. */
  8.  
  9. #include <QuickDraw.h>
  10. #include <Events.h>
  11. #include <Windows.h>
  12. #include <Desk.h>
  13. #include <Controls.h>
  14. #include <Menus.h>
  15. #include <ToolUtils.h>
  16.  
  17. #include "EventLoop.h"
  18. #include "MenuDispatch.h"
  19. #include "vcInterface.h"
  20.  
  21. Boolean        Done = false;                /* true when Quit is selected */
  22. Boolean        KeyPressed = false;            /* true most recent event is a keyDown event */
  23. char        KeyValue = 0;                /* the ascii code of the most recent key down */
  24.  
  25. Boolean        WNE_available = false;        /* Does WNE exist on this mac?? */
  26. Boolean        BackgroundFlag = false;        /* true if we are in the background */
  27.  
  28. void DoCloseWindow(register EventRecord *evt, register WindowPtr theWindow);
  29. void DoClickInContent(register EventRecord *evt, register WindowPtr theWindow);
  30. void DoDragWindow(register EventRecord *evt, register WindowPtr theWindow);
  31. void DoGrowWindow(register EventRecord *evt, register WindowPtr theWindow);
  32. void DoZoom(register EventRecord *evt, register WindowPtr theWindow, int part);
  33. void DoMenu(register long msel);
  34. void DoKey(register EventRecord *evt);
  35. void DrawClippedGrowIcon(WindowPtr theWindow);
  36. void DoUpdate(register EventRecord *evt);
  37. void ActivateWindow(register WindowRecord    *newFrontWindow);
  38. void DeactivateWindow(register WindowRecord    *newBehindWindow);
  39. void DoActivate(register EventRecord *evt);
  40. void DoMFinder(register EventRecord *evt);
  41. void DoClick(register EventRecord *evt);
  42. void MainEvent(void);
  43.  
  44. extern void MenuDispatch(short menuNumber,short itemNumber);
  45. extern void DrawImage(GrafPtr graf);
  46. extern void AdjustMenuItems(void);
  47. extern void ChooseFile(short item);
  48.  
  49. extern ViewerObject    gViewer;
  50. extern WindowPtr    MainView;
  51.  
  52. void DoCloseWindow(register EventRecord *evt, register WindowPtr theWindow)
  53. {
  54.     if(TrackGoAway(theWindow,evt->where)) {
  55.         ChooseFile(cmdClose);
  56.     }
  57. }
  58.  
  59. void DoClickInContent(register EventRecord *evt, register WindowPtr theWindow)
  60. {
  61.     int                part;
  62.     ControlHandle    ctlh;
  63.     Point            pt;
  64.     GrafPtr            saveport;
  65.     Rect            frame;
  66.     
  67.     if(theWindow!=FrontWindow()) {
  68.         SelectWindow(theWindow);
  69.     } else {
  70.         GetPort(&saveport);
  71.         SetPort(theWindow);
  72.         pt = evt->where;
  73.         GlobalToLocal(&pt);
  74.         if(part = FindControl(pt,theWindow,&ctlh)) {
  75.             /* TrackControl Goes Here */
  76.         }
  77.         SetPort(saveport);
  78.     }
  79. }
  80.  
  81.  
  82. void DoDragWindow(register EventRecord *evt, register WindowPtr theWindow)
  83. {
  84.     DragWindow(theWindow,evt->where,&qd.screenBits.bounds);
  85. }
  86.  
  87.  
  88. void DoGrowWindow(register EventRecord *evt, register WindowPtr theWindow)
  89. {
  90.     long    newSize;
  91.     int        newHeight,newWidth;
  92.     Rect    growLimitSizes;
  93.     OSErr    anErr;
  94.  
  95.     SetPort(theWindow);
  96.  
  97.     growLimitSizes.top = 20;        /* min height */
  98.     growLimitSizes.bottom = 400;    /* max height */
  99.     growLimitSizes.left = 20;         /* min width */
  100.     growLimitSizes.right = 600;        /* max width */
  101.  
  102.     newSize = GrowWindow(theWindow,evt->where, &growLimitSizes);
  103.     if (newSize)
  104.     {
  105.         newHeight = HiWord(newSize);
  106.         newWidth = LoWord(newSize);
  107.         SizeWindow(theWindow, newWidth, newHeight, true);
  108.         InvalRect(&theWindow->portRect);
  109.         if (theWindow == MainView)
  110.             anErr = Q3ViewerSetBounds(gViewer, &theWindow->portRect);
  111.     }
  112. }
  113.  
  114. void DoZoom(register EventRecord *evt, register WindowPtr theWindow, int part)
  115. {
  116.     GrafPtr savePort;
  117.     OSErr    anErr;
  118.     
  119.     GetPort(&savePort);
  120.     SetPort(theWindow);
  121.     
  122.     if(TrackBox(theWindow,evt->where,part)) {
  123.         ZoomWindow(theWindow,part,true);
  124.         if (theWindow == MainView)
  125.         {
  126.             Rect    newRect;
  127.  
  128.             newRect = theWindow->portRect;
  129.             anErr = Q3ViewerSetBounds(gViewer, &newRect);
  130.         }
  131.     }
  132.     SetPort(savePort);
  133. }
  134.  
  135. void DoMenu(register long msel)
  136. {
  137.     int item,menu;
  138.  
  139.     item = LoWord(msel);
  140.     menu = HiWord(msel);
  141.     MenuDispatch(menu, item);
  142.     HiliteMenu(0);
  143. }
  144.  
  145. void DoKey(register EventRecord *evt)
  146. {
  147.     char        c;
  148.     
  149.     c = (char)evt->message & charCodeMask;
  150.     
  151.     if((evt->modifiers & cmdKey) == false) {
  152.         KeyPressed = true;
  153.         KeyValue = c;
  154.     } else {
  155.         AdjustMenuItems();
  156.         DoMenu(MenuKey(evt->message & charCodeMask));    
  157.     }
  158. }
  159.  
  160. void DrawClippedGrowIcon(WindowPtr theWindow)
  161. /*
  162.     Clip out the lines that appear
  163.     on the sides of a window with a grow icon.
  164. */
  165. {
  166.     Rect        clip;
  167.     RgnHandle    oldClip;
  168.     
  169.     oldClip = NewRgn();
  170.     GetClip(oldClip);
  171.     clip = theWindow->portRect;
  172.     clip.left = clip.right - 15;
  173.     clip.top = clip.bottom - 15;
  174.  
  175.     ClipRect(&clip);
  176.     
  177.     DrawGrowIcon(theWindow);
  178.     SetClip(oldClip);
  179. }
  180.  
  181. void DoUpdate(register EventRecord *evt)
  182. {
  183.     WindowPtr    updateWindow;
  184.     GrafPtr        savePort;
  185.     
  186.     GetPort(&savePort);                        /* save current port */
  187.     
  188.     updateWindow=(WindowPtr)evt->message;    /* get windowPtr from event msg */
  189.     SetPort(updateWindow);
  190.     BeginUpdate(updateWindow);                        
  191.     EraseRect(&updateWindow->portRect);        /* erase content region */
  192.  
  193.     if (updateWindow == MainView)
  194.         Q3ViewerDraw(gViewer);                /* Draw the view controller contents */
  195.     
  196.     DrawControls(updateWindow);                /* draw any controls in the window */
  197.     DrawClippedGrowIcon(updateWindow);
  198.     EndUpdate(updateWindow);
  199.         
  200.     SetPort(savePort);
  201. }
  202.  
  203.  
  204. void ActivateWindow(register WindowRecord    *newFrontWindow)
  205. {
  206.     /* This window is now active.  Controls should be enabled, etc. */
  207. }
  208.  
  209. void DeactivateWindow(register WindowRecord    *newBehindWindow)
  210. {
  211.     /* 
  212.         do anyting necessary to deactivate your windows here.
  213.         controls should be dimmed, etc.
  214.     */
  215. }
  216.  
  217. void DoActivate(register EventRecord *evt)
  218. {
  219.     if(evt->modifiers & activeFlag)
  220.         ActivateWindow((WindowRecord *)evt->message);
  221.     else
  222.         DeactivateWindow((WindowRecord *)evt->message);
  223. }
  224.  
  225. void DoMFinder(register EventRecord *evt)
  226. {
  227.     if( (evt->message >> 24) == suspendResumeMessage)
  228.         BackgroundFlag = !(evt->message & resumeFlag);
  229. }
  230.  
  231. void DoClick(register EventRecord *evt)
  232. {
  233.     WindowPtr    theWindow;
  234.     
  235.     switch(FindWindow(evt->where, &theWindow)) {
  236.         case inDesk:        break;
  237.         case inMenuBar:        AdjustMenuItems();
  238.                             DoMenu(MenuSelect(evt->where));
  239.                             break;
  240.         case inSysWindow:    SystemClick(evt,theWindow);
  241.                             break;
  242.         case inContent:        DoClickInContent(evt,theWindow);
  243.                             break;
  244.         case inDrag:        DoDragWindow(evt,theWindow);
  245.                             break;
  246.         case inGrow:        DoGrowWindow(evt,theWindow);
  247.                             break;
  248.         case inGoAway:        DoCloseWindow(evt,theWindow);
  249.                             break;
  250.         case inZoomIn:        DoZoom(evt,theWindow,inZoomIn);
  251.                             break;
  252.         case inZoomOut:        DoZoom(evt,theWindow,inZoomOut);
  253.                             break;
  254.         default:            break;
  255.     }
  256. }
  257.  
  258.  
  259. void MainEvent(void)
  260. {
  261.     EventRecord    event;
  262.     Boolean        eventOccured, wasQ3Event;
  263.     Point        localPt;
  264.     
  265.     KeyPressed = false;                /* set to false every time through    */
  266.     if (WNE_available)
  267.         eventOccured = WaitNextEvent(everyEvent,&event,10,nil);
  268.     else {
  269.         SystemTask();
  270.         eventOccured = GetNextEvent(everyEvent, &event);
  271.     }
  272.     if (eventOccured)
  273.     {
  274.         if (MainView)
  275.             SetPort(MainView);                /* just to make sure */
  276.         GetMouse(&localPt);
  277.         wasQ3Event = false;
  278.         if (gViewer)
  279.         {
  280.             if (!Q3ViewerAdjustCursor(gViewer, &localPt))
  281.                 InitCursor();
  282.             wasQ3Event = Q3ViewerEvent(gViewer, &event);
  283.         }
  284.         if (!wasQ3Event)
  285.             switch(event.what)
  286.             {
  287.                 case nullEvent:                                break;
  288.                 case mouseDown:        DoClick(&event);        break;
  289.                 case mouseUp:                                 break;
  290.                 case keyDown:        DoKey(&event);            break;
  291.                 case keyUp:                                     break;
  292.                 case autoKey:        DoKey(&event);            break;
  293.                 case updateEvt:        DoUpdate(&event);        break;
  294.                 case diskEvt:                                 break;
  295.                 case activateEvt:    DoActivate(&event);        break;
  296.                 case networkEvt:                            break;
  297.                 case driverEvt:                                 break;
  298.                 case app1Evt:                                 break;
  299.                 case app2Evt:                                 break;
  300.                 case app3Evt:                                 break;
  301.                 case osEvt:            DoMFinder(&event);        break;
  302.                 default:                                    break;
  303.             }
  304.     }
  305. }
  306.  
  307. /* EOF */